2023/12/232114字符

属性描述符

Property Descriptor 属性描述符

  • 用于描述一个属性的相关信息
const obj = {
    name: 'bozai',
    age: 18
}

// 获
const desc1 = Object.getOwnPropertyDescriptor(obj, 'name');
console.log(desc1);  //--> {value: "bozai", writable: true, enumerable: true, configurable: true}

const desc2 = Object.getOwnPropertyDescriptors(obj);
console.log(desc2);  //--> age: {value: 18, writable: true, enumerable: true, configurable: true}
                        // name: {value: "bozai", writable: true, enumerable: true, configurable: true}

// 改
Object.defineProperties(obj, {
    age: {
        value: 20
    }
})

Object.defineProperty(obj, 'age', {
    value: 17,
    configurable: false,  // 描述符是否可以修改
    enumerable: false,  // 属性是否可以被枚举(不可循环)
    writable: false,  // 属性是否可以重新赋值
})
obj.age = 30;  // 重新赋值无效(以 Object.defineProperty 的方式赋值将报错)
console.log(obj);  //--> {name: "bozai", age: 17}

get() & set()

const obj = {
    name: 'bozai',
    age: 18
}
Object.defineProperty(obj, 'age', {
    get () {  // 获取属性
        console.log('get');
    },
    set (val) {  // 设置属性
        console.log('set' + val);
    }
})
obj.age  //--> get
obj.age = 20  //--> set20
console.log(obj.age)  //--> get undefined

控制属性限定范围

const obj = {
    age: 18,
}
Object.defineProperty(obj, 'age', {
    get () {
        return obj._age;
    },
    set (val) {
        if (val < 0) {
            val = 0;
        } else if (val > 100) {
            val = 100
        }
        obj._age = val;
    }
})
obj.age = -200;
console.log(obj.age);  //--> 0

常用场景,可以利用属性赋值渲染DOM

function HTMLSpanElement () {
    Object.defineProperty(this, 'innerHTML', {
        get () {
            // 获取对应元素内容
        },
        set (val) {
            // 重新渲染页面窗口
        }
    })
}